#include <stdio.h>
#include <stdlib.h>
#include "matrixThreeD_utils.h"

//释放内存 
void freeMatrixTD(double ***matrix, int x, int y, int z) {
    for (int i = 0; i < x; i++) {
    	for (int j = 0; j < y; j++) {
    		free(matrix[i][j]);
		}
        free(matrix[i]);
    }
    free(matrix);
}
//打印矩阵 
void printMatrixTD(double ***matrix, int x, int y, int z) {
    for (int i = 0; i < x; i++) {
        printf("第 %d 个二维矩阵:\n", i + 1);
        for (int j = 0; j < y; j++) {
            for (int k = 0; k < z; k++) {
                printf("%-10.2lf ", matrix[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }
}
// 录入矩阵
double*** enterMatrixTD(int x, int y, int z) {
	// 动态分配三维矩阵内存
    double ***matrix = (double ***)malloc(x * sizeof(double **));
    if (matrix == NULL) {
        printf("内存分配失败！\n");
        return NULL;
    }
    for (int i = 0; i < x; i++) {
        matrix[i] = (double **)malloc(y * sizeof(double *));
        if (matrix[i] == NULL) {
            printf("内存分配失败！\n");
            for (int j = 0; j < i; j++) {
                free(matrix[j]);
            }
            free(matrix);
            return NULL;
        }
        for (int j = 0; j < y; j++) {
            matrix[i][j] = (double *)malloc(z * sizeof(double));
            if (matrix[i][j] == NULL) {
                printf("内存分配失败！\n");
                for (int k = 0; k < j; k++) {
                    free(matrix[i][k]);
                }
                for (int k = 0; k < i; k++) {
                    free(matrix[k]);
                }
                free(matrix);
                return NULL;
            }
        }
    }
    // 录入
    printf("请按顺序输入矩阵元素（共 %d 个二维矩阵，每个二维矩阵 %d 行 %d 列）：\n", x, y, z);
    int valid = 1;
    for (int i = 0; i < x; i++) {
        if (!valid) break;
        for (int j = 0; j < y; j++) {
            if (!valid) break;
            for (int k = 0; k < z; k++) {
                if (scanf("%lf", &matrix[i][j][k]) != 1) {
                	valid = 0;
                    while (getchar() != '\n'); // 清空输入缓冲区
                    printf("输入格式错误，请输入有效的浮点数。\n");
                    break;
            }
        }
        if (!valid) {
            // 输入错误，释放已分配的内存并返回 NULL
            freeMatrixTD(matrix, x, y, z);
            return NULL;
        }
    }
    return matrix;
} 
// 检查矩阵
int checkTD(int *x, int *y, int *z) {
    printf("请输入矩阵的三个维度大小（用空格分隔）：");
    if (scanf("%d %d %d", x, y, z) != 3) {
        printf("输入格式错误，请输入三个整数表示三个维度大小。\n");
        while (getchar() != '\n'); // 清空输入缓冲区
        return 0;
    }
    while (getchar() != '\n'); // 清空输入缓冲区
    if (*x <= 0 || *y <= 0 || *z <= 0) {
        printf("三个维度大小必须为正整数。\n");
        while (getchar() != '\n'); // 清空输入缓冲区
        return 0;
    }
    return 1;
}
